Archiv der Kategorie: Raspberry Pi

[dashing] Widget blinkt bei neuen Daten

Je nachdem wieviele Widgets auf dem Dashboard aufgeführt sind, ist es hilfreich das das Widget hervorgehoben wird auf dem zum Beispiel die Daten aktualisiert werden oder ein bestimmter Status erreicht wird.

In diesem Beispiel blinkt das Widget auf, wenn neue Daten ausgegeben werden.

Hierfür wurde in der scss Datei folgendes hinterlegt:
@keyframes blink {
50% { opacity : 0.0; }
}

Vor dem letzten } der Widget Klasse wurde zusätzlich folgendes eingefügt:
&.blinking {
animation: blink 1s linear infinite;
animation-iteration-count: 2;
}

Der Aufruf der Klasse erfolgt bei neuen Daten in der coffee Datei:
class Dashing.Text extends Dashing.Widget
onData: (data) ->
node = $(@node)
node.addClass("blinking")
setTimeout ( =>
node.removeClass("blinking")
), 5000

Damit das Widget nur blinkt wenn sich auch der Inhalt der Daten ändert, wurde in der coffee Datei eine Zeile hinzugefügt:
class Dashing.Text extends Dashing.Widget
onData: (data) ->
if data.blink
node = $(@node)
node.addClass("blinking")
setTimeout ( =>
node.removeClass("blinking")
), 5000

Das Widget blinkt nur wenn die Variable blink mit übergeben wurde.

Die Prüfung ob neue Werte mit übergeben werden, erfolgt hier in dem eingerichtetem Job.
Von dem aktuellen und dem neuen Datenarray wird zum Vergleich ein hash generiert, stimmt der hash nicht überein, wird die blink Variable mit übermittelt.
if ausgabe_hash == ausgabe.to_set.hash
send_event("widget1",{ values: ausgabe.values })
else
send_event("widget1",{ values: ausgabe.values, blink: ausgabe.length })
end

ausgabe_hash = ausgabe.to_set.hash

[dashing] Daten aus einer csv Datei

Neben der Datenübergabe per http Post können auch Werte aus einer csv Datei gelesen werden. Die Datei kann manuell erstellt werden, oder Sie wird aus einem Ticketsystem generiert und zur Verfügung gestellt. In diesem Beispiel befindet sich die csv Datei in dem Root Verzeichniss des Dashboard.

Aufbau der file.csv(Ticket,Kunde,Störung)

DB-2233,Kunde1,Ausfall Datenbank
AP-1294,Kunde2,schlechte Performance Webservice

Aufbau der jobs/tickets.rb:

require 'csv'
require 'json'

SCHEDULER.every '30s' do

ausgabe = {}
idx = 0
CSV.foreach('file.csv') do |row|
ausgabe[idx] = {:ticket => row[0],:kunde => row[1],:stoerung => row[2]}
idx += 1
end

send_event("majors",{ values: ausgabe.values })

end

[dashing] Widget mit mehrzeiliger Ausgabe erstellen

Eine kurze Anleitung zum installieren das Dashboards findet ihr hier.

Zum experimentieren habe ich alle zuvor angelegten Widgets, Jobs etc. im Demo Dashboard entfernt.

Für das Widget wurden in der dashboard/sample.erb folgende Zeilen hinzugefügt.

<li data-row="1" data-col="1" data-sizex="2" data-sizey="1"><code>
<div data-id="tickets" data-view="Text"
></div>
</li>

Angesprochen wird das Widget über die data-id=“tickets“.

Unter dem Verzeichnis widgets/text wurden die benötigten Dateien mit dem entsprechendem Inhalt angelegt.

text.html

<h1 class=“title“ data-bind=“title“></h1>

<li data-foreach-value=“values“ data-bind-class=“value.status“>

      <div class=“ticket“ data-bind=“value.ticket“></div>

      <div class=“kunde“ data-bind=“value.kunde“></div>

      <div class=“stoerung“ data-bind=“value.stoerung“></div>

        <div style=“clear:both“></div>

    </li>

<p class=“more-info“ data-bind=“moreinfo“></p>

<p class=“updated-at“ data-bind=“updatedAtMessage“></p>

 


text.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-text {
background-color: $background-color;
.title {
color: $title-color;
}
.more-info {
color: $moreinfo-color;
}
.updated-at {
color: rgba(255, 255, 255, 0.7);
}
.ticket{
width:50px;
float:left;
text-align:left;
}
.kunde{
width:175px;
float:left;
text-align:left;
}
.stoerung{
width:300px;
float:left;
text-align:left;
}
}

text.coffee
class Dashing.Text extends Dashing.Widget
ready: ->
# This is fired when the widget is done being rendered

onData: (data) ->
# Handle incoming data
# You can access the html node of this widget with `@node`
# Example: $(@node).fadeOut().fadeIn() will make the node flash each time data comes in.

Damit die angelegten Wigdets per http Post mit Daten befüllt werden können, wird der in der config.ru hinterlegte Token benötigt.

require 'dashing'

configure do
set :auth_token, 'hereweare‘

Nun können die Werte zum Beispiel per curl übergeben werden.
curl -d '{ "auth_token": "hereweare", "values":[{"ticket":"223","kunde":"Kassupke","stoerung":"Ausfall Datenbank"},{"ticket":"231","kunde":"Müller","stoerung":"Mailversand eingeschränkt"}] }' http://localhost:3030/widgets/tickets

Dashboard

[nginx] einrichten von vhosts

Wie beim Apache Webserver ist es auch unter nginx möglich verschiedene virtuelle hosts einzurichten. Bei nginx werden diese jedoch nicht als virtuelle hosts bezeichnet sondern als server blocks.

Damit die Seiten unter verschiedenen Benutzern bearbeitet werden können, habe ich zunächst einen Benutzer angelegt adduser seite1 /var/vhosts/seite1. Unter dem Benutzer seite1 wurden die Verzeichnisse logs und www angelegt, im Anschluss müssen noch die Rechte der Verzeichnisse angepasst werden.

chmod 755 /var/vhosts/seite1
chmod 755 /var/vhosts/seite1/www
chmod 760 /var/vhosts/seite1/logs

Damit der nginx die log Dateien in dem angegeben Verzeichnis erstellen kann muss der nginx Benutzer der Gruppe seite1 hinzugefügt werden.

Die Konfiguration des Vhosts wurde in der Datei /etc/nginx/conf.d/seite1.conf erstellt.

server {
index index.html;

server_name www.seite1.de;
access_log /var/vhosts/seite1/logs/seite1.access.log main;
error_log /var/vhosts/seite1/logs/seite1.error.log;

root /var/vhosts/seite1/www;
}

Wenn bei auftretenden Fehlern zum Beispiel die eigene 404 Seite angezeigt werden soll, reicht der folgende Eintrag in der Konfiguration.

error_page 404 errors/404.html;

[openhab] fs20 Funk-Dämmerungssender einbinden

Für das schalten von Aktoren kann wie in einem vorangegangenen Artikel die Anwesenheitserkennung verwendet werden. Durch eine Regel wird in einem bestimmten Zeitraum geprüft ob jemand zu Hause ist und die Aktoren werden eingeschaltet. Handelt es sich bei den Aktoren jedoch um Lampen, kann es vorkommen das Diese zu früh beziehungsweise zu spät geschaltet werden. Damit das Schalten zum richtigen Zeitpunkt erfolgt, kann der jeweilige Sonnenaufgang / Sonnenuntergang berechnet werden und mit in die Regel eingebunden werden.

Ich habe mich jedoch für einen Dämmerrungssensor entschieden, diesen gibt es für das fs20 System als Bausatz von ELV. Für das löten und zusammensetzen der einzelnen Komponenten benötigt man ca. 30 Minuten. Der Sensor bietet zwei Kanäle die einzeln konfiguriert werden können. Je nach Konfiguration und Helligkeit wird ein on bzw off gesendet. Zum auslesen des voreingestellten Hauscodes hatte ich bereits den Artikel https://www.itbasic.de/openhab-fs20-fernbedienung-und-switch-status-aktualisierung/ geschrieben.

Über die angepasste Regel wird das Licht nun in einem definierten Zeitraum ein bzw ausgeschaltet, wenn jemand zu Hause ist und der definierte Lichtwert erreicht wurde.

rule AnwesendFlur
when
Time cron "* */5 * * * ?"
then
if (now.getHourOfDay() >= 6 && now.getHourOfDay() <=22 && Presence.state == ON && FlurAutomatik.state == ON && fsda1.state == ON) {
if(FlurAlle.state == OFF){
sendCommand(FlurAlle, ON)
logInfo("PresenceCheck", "LICHT AN" )
}
} else {
if(FlurAlle.state == ON && FlurAutomatik.state == ON){
sendCommand(FlurAlle, OFF)
logInfo("PresenceCheck", "LICHT AUS" )
}
}
end

Die beiden Kanäle des Sensors wurden wie folgt in einer items Datei hinterlegt:
Switch fsda1 "Daemmer1 " (fstest) {fs20="C4A600"}
Switch fsda2 "Daemmer2 " (fstest) {fs20="C4A601"}

fs20-daemmer

die gelieferten Bauteile