Schlagwort-Archive: dashing.io

API Zugriff auf den Google Kalender

Neulich dachte ich mir, es könnte doch interessant sein den privaten Google Kalender per Ruby auszulesen und auf dem Dashboard auszugeben.

Für den API Zugriff muss zunächst ein Projekt in der google cloud unter https://console.cloud.google.com/projectcreate?hl=de ein Projekt erstellt werden. Nachdem das Projekt angelegt wurde kann unter dem Menüpunkt IAM ein Dienstkonto erstellt werden. Bei dem Erstellen des Dienstkontos sollte gleich der Schlüssel generiert werden als json Datei, diese wird später noch benötigt(dienstbenutzer.json).

Um die Daten abrufen zu können, muss das Dienstkonto auf den Google Kalender berechtigt werden.

Folgende gems wurden installiert: google-api-client, google-apis-calendar_v3, googleauth, json

Das Script selbst ist wie folgt aufgebaut:

require 'google/apis/calendar_v3'
require 'googleauth'
require 'json'

t = Time.now
zeit =  t.strftime("%Y-%d-%mT%H:%M:%Sz")
content = Google::Apis::CalendarV3::CalendarService.new
scope = 'https://www.googleapis.com/auth/calendar.readonly'

content.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: File.open('./dienstbenutzer.json'),
  scope: scope)
content.authorization.fetch_access_token!
termine = content.list_events(calenderid='<EmailAdresse des Kalenders>' )
events = termine.items.map do |e|
  {
     title: e.summary,
     start: e.start.date || e.start.date_time.strftime('%d.%m.%y %H:%M')}

end
puts events

Als weiteren Parameter kann neben der calenderid auch time_min und time_max verwendet werden, um die Ausgabe der Termine zu begrenzen.

Raum-Temperatur auf dem Dashboard

Temperatur und Feuchtigkeit mit dem Wemos D1 Mini werden gemessen und auf dem Dashboard ausgegeben

Ich beschäftige mich aktuell mit dem Wemos D1 Mini und dem messen von Temperaturen sowie dem versenden der Daten. Ursprünglich bin ich auf das Thema gestoßen, da ich auf dem Boot verschiedene Stellen überwachen möchte, wie bspw. die Temperatur im Motorraum. Unter anderem bestellte ich mir dafür den bereits genannten Wemos D1 Mini und dazu unterschiedliche Sensoren wie bspw. den DHT22. Der DHT22 ist ein Temperatur- und Feuchtigkeitssensor. Der Wemos D1 Mini bringt auch gleich einen WLAN-Chip mit.

Um an Bord die gemessenen Werte an den Raspberry zu senden und nicht quer durchs Boot neue Kabel verlegen zu müssen, war die Übertragung mittels WLAN eine charmante Alternative.
Bis hierhin war das eigentlich nur die Vorgeschichte.
Interessant finde ich auch daheim die Temperatur und Feuchtigkeit, um zu erkennen wann wieder gelüftet werden muss. Die Darstellung auf dem Dashboard bot sich dafür an.
Keine Kabel verlegen zu müssen, bis auf für die Stromversorgung ggf. (3.3V oder 5V für den Betrieb werden benötigt), ist zu Hause genauso von Vorteil.

Da ich (aktuell) keinen Bedarf habe eine Historie der Werte zu speichern, kam mir die Idee die Werte direkt mittels API-Aufruf vom Wemos auf dem Dashboard aktualisieren zu lassen.
Das war die perfekte Übung für spätere Projekte an Bord.

Später kommt das ganze in ein Gehäuse.
Der Versuchsaufbau sieht wie folgt aus:

Auf dem Dashboard sieht die Kachel dann so aus:

Das ganze habe ich im Git gepflegt und ihr findet es mit entsprechender Anleitung zum nachbauen hier: https://github.com/janneshecht/Room-temperature

[dashing] globale Variablen

Ich nutze zwei verschiedene Systemen für die Dashboards. Das eine System wird zur Entwicklung von Widgets bzw. Anpassung von Scripts verwendet, das andere System für die Produktive Darstellung. Bislang mussten die Scripte nachdem sie auf das Prodsystem kopiert wurden angepasst werden, da teilweise absolute Pfade hinterlegt wurden.

Das ganze muss durch das setzen einer globalen Variable nicht mehr erfolgen. In dem Jobs Verzeichnis wurde die Datei variable.rb abgelegt, in der Datei sind die benötigten Variablen wie folgt angegeben: $GPFAD=“testsystem“
Damit in den Ruby Dateien darauf zugegriffen werden kann, muss zunächst die variable.rb eingebunden werden.

require_relative(‚variable.rb‘)
Nun kann innerhalb der rb Datei über $GPFAD auf die Variable zugegriffen werden.

[dashing] Willkommen Firma xyz über den gesamten Bildschirm

Das dashing.io Dashboard kann unter anderem in Empfangsbereichen von Firmen eingesetzt werden. Steht nun zum Beispiel ein Besuch eines Kunden an, so könnte man Ihn auf dem Dashboard willkommen heißen. Damit die Willkommensnachricht nicht nur unscheinbar in einer Kachel erscheint, habe ich dieses Widget erstellt. Die job Datei(rb) prüft ob es einen zeitlich passenden Eintrag in der csv Datei gibt und setzt das Widget per css auf Display Block. Das Widget legt sich über den gesamten Bildschirm, ist die Zeit des hinterlegten Kundenbesuchs abgelaufen so wird das Widget wieder ausgeblendet.

Folgende Dateien müssen in einem Verzeichnis Namens overlay abgelegt werden

overlay.coffee
class Dashing.Overlay extends Dashing.Widget
constructor: ->
super
onData: (data) ->
schalter = @schalter
node = $(@node)
if schalter == false then node.css(‚display‘,’none‘) else node.css(‚display‘,’block‘)
ready: ->
@onData(null)

overlay.html
<span data-bind=“titel“></span>
<div class=“bild“ ><img data-bind-src=“kunde“ ></div>
<div class=“text“ data-bind=“text | raw“></div>

overlay.scss
// —————————————————————————-
// Sass declarations
// —————————————————————————-
$background-color: #ec663c;
$title-color: rgba(255, 255, 255, 0.7);
$moreinfo-color:rgba(255, 255, 255, 0.7);
// —————————————————————————-
// Widget-text styles
// —————————————————————————-
.widget-overlay {
position: fixed;
bottom: 1px;
z-index:1000;
width:100%;
height:95%;
background-color: $background-color;
.title {
color: $title-color;
}
.more-info {
color: $moreinfo-color;
}
.updated-at {
color: rgba(255, 255, 255, 0.7);
}
.text{
color:#ffffff;
font-weight:bold;
margin-top:20%;
}
.bild{
height:100px;
width:95%;
text-align:right;
}
&.large h3 {
font-size: 65px;
}
}

Die rb Datei muss unter dem Verzeichnis jobs abgelegt werden, natürlich muss der Pfad zur CSV Datei angepasst werden.
overlay.rb
require ‚csv‘
require ‚json‘
require ‚date‘
require ‚time‘
ENV[‚TZ‘] = ‚Europe/Berlin‘
schalter = false
kunde = „x“
text = „x“
SCHEDULER.every ’30s‘ do
zeit = Time.now.to_i
schalter_zaehler = 0
ausgabe = {}
idx = 0
CSV.foreach(‚/home/dashing/sweet_dashboard_project/jobs/overlay.csv‘, col_sep: ‚;‘) do |row|
start = Time.parse(„#{row[0]} #{row[1]}:00 „).to_i
stop = Time.parse(„#{row[0]} #{row[2]}:00 „).to_i
if zeit.between?(start, stop)
schalter_zaehler += 1
kunde = row[3]
text = row[4]
ausgabe[0] = {:kunde => row[3],:text => row[4]}
end
end
if schalter_zaehler == 1
schalter = true
else
schalter = false
end
send_event(„overlay“,{ kunde: kunde , text: text, schalter: schalter })
#puts JSON.pretty_generate(ausgabe)
end

Aufbau der overlay.csv
2017-01-02;10:00;12:00;/assets/logo.png;Moin zusammen;
2017-05-08;20:00;21:51;/assets/logo.png;Willkommen Firma Kassupke<br/>bei der Tagung;

Die Logos der Firmen müssen unter dem Verzeichnis assets/images abgelegt werden.

Die Einbindung des Widgets erfolgt in der erb Datei in der letzten Zeile wie folgt:
<div data-id=“overlay“ data-view=“Overlay“ ></div>

Hier kann alles heruntergeladen werden.

[dashing] Icinga Widget ohne Soft-Zustände

In dem Artikel hatte ich ein Widget für dashing.io erstellt, welches die Icinga Alarme per json abholt und entsprechend ausgibt. In dem erstellten Job wurden jedoch auch die Soft-Zustände ausgegeben, was je nach System für Hektik sorgen kann.

Der Job wurde nun angepasst und mit Hilfe des Wertes service_attempt werden nun keine Soft-Zustände mehr ausgegeben.

attempt = werte[idx]["service_attempt"].split('/')
if attempt[0] == attempt[1]
if werte[idx]["service_state"].to_i == 0
dalert = "OK"
end
if werte[idx]["service_state"].to_i == 1
dalert = "WARNING"
z_warning += 1
end
if werte[idx]["service_state"].to_i == 2
dalert = "CRITICAL"
z_critical += 1
end
if werte[idx]["service_state"].to_i == 3
dalert = "UNKNOWN"
z_unknown += 1
end
laenge += 1
if laenge.to_i <= 20
review_content[laenge] = {:host => werte[idx][„host_name“],:what => werte[idx][„service_description“],:alert => dalert}
end
end